我在百度做教育 (百度“代码的艺术训练营”的诞生记)
注:
写这个标题时想起了“我在故宫修文物”。“我”非作者一人,而是由多名百度讲师志愿者组成的讲师团队。
原文为百度内网发布而写,本文有修改。
距离第一期“代码的艺术训练营”的策划和发起已经过去了近一年的时间。一年来,训练营的讲师从1名增加到了7名。训练营已经结束了5个班的教学,并在2018年的秋天又并行开启了5个班的教学。虽然已经有一部分的同学通过这个训练营的学习而受益,但是由于“小班长周期教学”(每个班控制在30人内,且持续4个月)的形式所限,历史上参与过这个班学习的同学不过100多名。
通过本文,希望说明一下我们的思路和经验,让更多的同学了解它。这个教育形式不仅仅适用于百度,也应该适用于中国的其他互联网公司。希望类似的培训能够在更大的范围开展起来。(有兴趣的同仁,欢迎和我联系,交流教学经验。)
什么是百度“代码的艺术训练营”?
是由百度技术学院(简称BIT)和百度CMC(代码委员会:Code Master Committee)联合组织的中长期培训(每期持续4个月)计划
讲师由百度内的高工兼任。教学工作主要在工作时间外开展
聚焦在提升软件工程的意识和能力,具体覆盖以下内容:需求分析和系统设计;软件编码;软件项目管理
1.缘起
做这个训练营的动机来自我做《代码的艺术》(视频版)课程。这个课程是2015年我为百度新同学准备的一个2小时的现场培训课。在2015年,这个课程大概现场讲了3-4次,同学们的反馈还不错。后来这个课程还单独录制了视频,放在度学堂作为在线课程。
有一天,我在楼道里遇到一个同学,和他聊起来这个课程。我随口一问“我在课程后面推荐的参考书看了吗”,这个同学回答说“没有”。这对我是一个很大的触动。《代码的艺术》我是作为一门“导引课程”来准备的,里面覆盖的内容很广,只是希望借这个课程给大家指个门。如果不配合后续的跟进学习,这门课对于实际落地起的作用很小。
于是,在2017年底,我找到BIT的同学,策划以“代码的艺术”为题举办更长期的训练营,组织同学做更深入的学习。
2.关于学习的内容
训练营主要学习的内容是“如何开发软件”。
微软的创始人比尔盖茨曾经说过,“写软件代表的是世界的将来”。但从我20多年的开发经历来看,在中国真正“关注于软件研发”的教育并不多。在高校中,很多老师并没有经过工业界的生产实践,软件工程这类的课程常常是照本宣科;在工业界,系统和深入的从软件工程的角度进行培训也是非常少的。如此造成的后果是,很多即使已经从事软件开发多年的同学,对于软件研发的基本方法仍然是不清楚的。
通过训练营,希望让学员了解:
软件研发是一门非常高深的学问,是值得花费8年10年甚至更多时间去深入探究的
已经有很多非常成熟的方法,是可以用于现实工作的。这些方法对提升软件研发的效率和质量有非常大的帮助
看到自己及中国互联网界和国际先进公司在软件研发水平方面的差距,从而更需要努力学习,奋起直追
训练营聚焦在软件研发的几个关键步骤上,包括:软件的需求分析和系统设计,编码,软件项目管理。虽然训练营会持续约4个月的时间,但是对软件开发这门大学问来说,仍然是非常短的。所以,训练营的主要目的仍然是提升学员的软件工程意识,更多深入的提高要靠学员自己后续多年的跟进学习和实践。
3.关于学习的方式
在训练营中,学习的主体是学员,而不是讲师。学习的主要方式包括:学习(阅读),思考(写分享材料,研讨),实践(代码、文档)。
之前很多的培训主要是讲师单向的讲述,学员投入了多少、是否接受和理解了,讲师是不知道的。在训练营中,主要的学习方式是:由讲师指定一些书籍或在线课程,由学员自己在课下学习。学员能够收获多少,很大程度上取决于学员自己的投入。一轮的学习,有的同学可能只投入2个小时,有的同学会投入20个小时。每个同学可以根据自己的情况和兴趣来选择性的投入。
通过训练营,也希望能够培养学员的阅读习惯。即使在非常互联网化的今天,阅读书籍仍然是非常(我真想用“最”)重要的学习方式。我曾经问过一些同学,公众号和博客是他们主要的学习途径。和这些“快消品”相比,经典书籍是作者花费数年甚至数十年的成果。阅读书籍,有利于建立结构化的思维。训练营选用的《201 Principles of Software Programming》是1995年出版的,其中80%以上的内容放在今天仍然是非常正确的。从训练营的实践来看,“没有阅读习惯,不会阅读”,限制了很多同学的发展。
“学而不思则罔”。训练营要求学习在阅读后必须上交读后感,并且会组织大家来分享和讨论。这个环节给参与的同学增加了一些学习的压力,让大家在阅读的时候更有目的的去理解和总结所学的内容。通过这个环节,讲师也能够了解学员的理解程度,并通过讨论现场的点评来纠偏和加深认识。有些同学所分享的案例,不仅仅对其他同学是有启发的,讲师也在其中有所收获。
在训练营的大纲中,专门安排了2轮作为实践的环节,分别是文档的编写/review和代码的编写/review。由于资源所限,这两个环节只能是蜻蜓点水一般,能够让大家建立一些意识就好。真正的提高,还要靠学员自己平时的努力、及所在团队的导师更多的辅导。
4.关于训练营的组织方式
相对于其它的培训,训练营的“学习负担”是比较重的。为了筛选出真正有意愿学习的同学,从第二届的训练营开始,启用了“课程押金”的机制。每名同学要上交200元的押金,如果出现违反“课堂纪律”的情况,押金会被扣除,并可能会被开除。(注:扣除的押金用于捐赠希望工程。截至目前已捐赠了数千元。)
训练营采用的“小班教学”方式、及对讲师的高要求,决定了训练营的名额是非常有限的。在第一届训练营时,开始招收的32人,最后坚持下来的只有12人。这对讲师的资源是一种巨大的浪费。押金制度有效的将没有很强学习意愿的同学过滤掉了。
使用严格的纪律,希望的是保证学习的质量。很遗憾,也确实看到很多同学由于“工作太忙“无法参加,或中途退出。当有同学告诉我,”由于工作太忙而没有时间学习“的时候,我每次都这样回答:正是由于不学习,所以才会这么忙。太多错误启动的项目,太多没有搞清楚的需求,太多低效率的执行,太多质量很差的代码,太多难以阅读的文档 – 每个人都应该好好反思一下,时间到底去哪里了。不学习,不反思,不提高,工作10年、20年,仍然是低级的软件工程师。
5.训练营的效果
截至现在,从训练营“毕业”的同学有60多名(有不少同学由于不交作业,或其它原因中途退出了)。
训练营肯定不是一个“包治百病”的灵丹妙药。我们既不能期望所有参加训练营的同学都受益甚大,也不能期望一个同学经过4个月的学习就突飞猛进。教育本来就是一个缓慢的过程,需要所有人(无论是学员,还是讲师)都投入足够的耐心。
所有训练营的讲师都投入了巨大的努力。对于每一个班来说,主持的讲师至少要投入10个晚上的时间(一般在晚上7点以后,每个晚上至少2个小时)和学员交流。另外在组织报名、熟悉学习材料、review学员的文档/代码等方面,讲师还需要投入很多额外的时间。粗略估计,组织一个班,负责的讲师至少要在正常工作时间外花费40个小时。
最能够让各位讲师欣慰的是,每个班至少总会有几个同学会说,“原来我以前用的方法是错误的呀”,“原来软件开发还有这么多要学和注意的东西”。“学,然后知不足”,如果能够让参加的学员达到这样一个效果也是很好的了。
6.调查问卷的启示
每次开新班的时候,都会给学员发一个调查问卷,用于了解学员的背景,以便有的放矢。这个问卷的一些数据还是非常有启示的,这里展示一些调研的结果。
从我在多家公司的工作经历、及平时对业界的观察来看,这些结果不仅仅反映了百度的状况,也反映出中国互联网公司的普遍情况。
6.1 关于软件工程师的职业规划
设计了这样一个问题:
你认为会自己从事软件开发工作到什么年龄(请写出真实的想法)?
这个问题是用来调研学员的职业规划的。
我的思路:一个对软件开发没有长期职业规划的同学,很难做出很好的学习规划
多次的调研数据显示,有超过50%的同学都把自己从事软件开发这个职业的上限定制了45岁。而对照美国的情况,很多工程师可以工作到50、甚至60岁。
这一方面反映出职业规划方面的巨大的问题,也反映出在软件工程师人力资源方面的巨大浪费– 软件研发是非常依靠经验的,而我们这里有经验的人都主动或被动的希望退出了
6.2 关于代码编写
发现有如下的问题:
有相当数量的项目,没有明确的编码规范,或者是虽然有编码规范、但没有严格执行
虽然绝大部分同学都认为CodeReview很重要,但是认真执行Code Review的项目比例并不高
6.3 关于设计文档的编写
发现有如下的问题:
有相当比例的同学,在编码前,只会写简单的文档;有一些同学压根就不写设计文档;能够执行“先把文档写清楚再写代码的同学”比例比较低
能够有习惯及写好需求文档的同学比例很低
如果把做项目比喻成一个导弹的话,“需求分析”就是导航单元。大家可以想象,缺乏了导航单元的导弹,其战斗力是什么样子
约有一半以上的设计文档是没有经过严格review的
参见 怎么写项目文档
6.4 关于项目管理
约90%的反馈认为自己缺乏系统的项目管理知识和方法,甚至完全没有项目管理的经验
从我的观察看,项目管理技能的缺乏确实对业界的工作效率影响很大
部分可参见 怎么做好时间管理(这篇文章讲的还不是项目管理)
6.5 关于学习目标
我们设计了1个单选题,参加本次培训,你最主要的诉求是?(提高编码能力,提升项目管理能力,提升写设计文档的能力)
数据反馈:近5成参加学习的同学主要诉求是提高编码能力,3成同学希望提升项目管理能力,只有2成同学的主要诉求是提高设计能力
考虑训练营的培训对象(至少工作2-3年以上的同学),可以看出学员在自我认知方面的问题。
在《代码的艺术》中,我曾经说:好的代码不是写出来的,而是一系列工作的结果
对于有一定经验的同学,重点要提升设计能力,其次是项目管理能力。编码能力应该是工作前3年就要解决的问题。
6.6 关于书籍的阅读
调查数据显示,有30%的同学阅读软件研发(不含某个语言的指南、网络、操作系统、数据库、算法等这样的书)的书小于等于1本
从大家反馈所阅读的书目来看,系统阅读过《Code Complete》、《Clean Code》、《人月神话》这类软件工程方法论的书籍的同学不多
先进方法论的缺乏,是目前的一个重大问题。毫不客气的说,从正规软件开发的角度,目前很多在岗的软件工程师是这个领域的文盲。对很多同学来说,在软件研发的思想和方法方面,仍然处于刀耕火种的阶段。
参见 “读书”已经成为一道鸿沟
7. 结语
百年前,晚清的名臣张之洞尝劝学曰:“世运之明晦,人才之盛衰,其表在政,其里在学。”
在公司内,也曾经和一些同学交流过现在项目研发中遇到的种种问题。我感觉,其中有不少问题都不是管理可以解决的,而是要依靠教育。一只军队要打胜仗,除了战略和军心士气之外,还需要好的装备和训练。软件开发亦然。
百度代码的艺术训练营,这只是在百度内做教育的一个小小的尝试。希望更多的同学能够加入我们。
一起努力,为了更好的中国!